package com.yhos.platform.oopston.service.biz.sensitiveword;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.*;

/**
 * @Description: 初始化敏感词库，将敏感词加入到HashMap中，构建DFA算法模型
 * @Project：test
 */
public class SensitiveWordInit {
    private String ENCODING = "UTF-8"; // 字符编码

    @SuppressWarnings("rawtypes")
    public static HashMap sensitiveWordMap;

    public SensitiveWordInit() {
        super();
    }

    /**
     *
     */
    @SuppressWarnings("rawtypes")
    private static Map initKeyWord() {
        try {
            // 读取敏感词库
            Set<String> keyWordSet = readSensitiveWordFile();
            // 将敏感词库加入到HashMap中
            addSensitiveWordToHashMap(keyWordSet);
            // spring获取application，然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sensitiveWordMap;
    }

	public static Map buildSensitiveWordMap(List<Map> rowList) {
		try {
			// 读取敏感词库
			Set<String> keyWordSet = new HashSet();
			if(rowList != null && rowList.size() > 0){
				for(int i=0; i<rowList.size(); i++){
					Map<String, Object> entry = (Map<String, Object>) rowList.get(i);
					String value = String.valueOf(entry.get("word"));
					keyWordSet.add(value);
				}
			}
			// 将敏感词库加入到HashMap中
			addSensitiveWordToHashMap(keyWordSet);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return sensitiveWordMap;
	}

    public static Map buildSensitiveLevelMap(List<Map> rowList) {
        Map sensitiveLevelMap = new HashMap();
        try {
            if (rowList != null && rowList.size() > 0) {
                for (int i = 0; i < rowList.size(); i++) {
                    Map<String, Object> entry = (Map<String, Object>) rowList.get(i);
                    String word = String.valueOf(entry.get("word"));
//                    String value = String.valueOf(entry.get("level"));
                    sensitiveLevelMap.put(word, word);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return sensitiveLevelMap;
    }

    /**
     * 读取敏感词库，将敏感词放入HashSet中，构建一个DFA算法模型：<br>
     * 中 = {
     * isEnd = 0
     * 国 = {<br>
     * isEnd = 1
     * 人 = {isEnd = 0
     * 民 = {isEnd = 1}
     * }
     * 男  = {
     * isEnd = 0
     * 人 = {
     * isEnd = 1
     * }
     * }
     * }
     * }
     * 五 = {
     * isEnd = 0
     * 星 = {
     * isEnd = 0
     * 红 = {
     * isEnd = 0
     * 旗 = {
     * isEnd = 1
     * }
     * }
     * }
     * }
     *
     * @param keyWordSet 敏感词库
     * @version 1.0
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    private static void addSensitiveWordToHashMap(Set<String> keyWordSet) {
        sensitiveWordMap = new HashMap(keyWordSet.size()); // 初始化敏感词容器，减少扩容操作
        String key = null;
        Map nowMap = null;
        Map<String, String> newWordMap = null;
        // 迭代keyWordSet
        Iterator<String> iterator = keyWordSet.iterator();
        while (iterator.hasNext()) {
            key = iterator.next(); // 关键字
            nowMap = sensitiveWordMap;
            for (int i = 0; i < key.length(); i++) {
                char keyChar = key.charAt(i); // 转换成char型
                Object wordMap = nowMap.get(keyChar); // 获取

                if (wordMap != null) { // 如果存在该key，直接赋值
                    nowMap = (Map) wordMap;
                } else { // 不存在则，则构建一个map，同时将isEnd设置为0，因为他不是最后一个
                    newWordMap = new HashMap<String, String>();
                    newWordMap.put("isEnd", "0"); // 不是最后一个
                    nowMap.put(keyChar, newWordMap);
                    nowMap = newWordMap;
                }

                if (i == key.length() - 1) {
                    nowMap.put("isEnd", "1"); // 最后一个
                }
            }
        }
    }

    /**
     * 读取敏感词库中的内容，将内容添加到set集合中
     *
     * @return
     * @throws Exception
     * @version 1.0
     */
    @SuppressWarnings("resource")
    public static Set<String> readSensitiveWordFile() throws Exception {
        Set<String> set = null;
        InputStream is = SensitiveWordFilter.class
                .getResourceAsStream("/sensitivekey.txt");
        InputStreamReader read = new InputStreamReader(is);
        try {
            if (read != null) { // 文件流是否存在
                set = new HashSet<String>();
                BufferedReader bufferedReader = new BufferedReader(read);
                String txt = null;
                while ((txt = bufferedReader.readLine()) != null) { // 读取文件，将文件内容放入到set中
                    set.add(txt);
                }
            } else { // 不存在抛出异常信息
                throw new Exception("敏感词库文件不存在");
            }
        } catch (Exception e) {
            throw e;
        } finally {
            read.close(); // 关闭文件流
        }
        return set;
    }
}
